Register multiple APP_FILTER providers in order from most specific to most general. Each filter handles its declared @Catch() type. The final global filter should use @Catch() with no argument as a catch-all safety net for any exception not handled by the more specific filters above it.
Register most specific filters first and the catch-all last.
Each filter only handles exceptions matching its @Catch() type — no overlap.
A @Catch(QueryFailedError) filter handles TypeORM errors before they reach the generic filter.
The @Catch() safety net catches everything not handled by the filters above it.
This layered approach keeps each filter small and single-responsibility.